﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BaseLinQ.DataContex;
using Core;
using DevExpress.Web.ASPxGridView;
using Module;
using RBAC;
using Solution.AppCode;

namespace Solutions.Admin.QuanLyVaiTro
{
    public partial class QuanLyVaiTro : System.Web.UI.UserControl
    {
        Utils util = new Utils();
        long idDonViThaoTac;
        long idVaiTro = 0;
        long idUser = 0;
        string _conn = ConfigurationSettings.AppSettings["ConnectString"];
        private RBACDataContext db;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                grdDanhSachQuyen.Selection.IsRowSelected(200);
                LoadGrid();
                btnOpenForm.Visible = true;
                grdDanhSachMenu.Columns[8].Visible = true;
                idDonViThaoTac = donvithaotac();
                if (!util.checkQuyenThaoTac(idUser, idDonViThaoTac, idVaiTro, "QuanLyVaiTro", "VAI_TRO", Constants.ACTION_CREATE))
                {
                    btnOpenForm.Visible = false;
                }
                if (!util.checkQuyenThaoTac(idUser, idDonViThaoTac, idVaiTro, "QuanLyVaiTro", "VAI_TRO", Constants.ACTION_DELETE))
                {
                    grdDanhSachMenu.Columns[8].Visible = false;
                }
            }

            if (grdDanhSachMenu.IsCallback) // this line returns false
            {
                LoadGrid();
            }
            if (grdDanhSachQuyen.IsCallback) // this line returns false
            {
                LoadDanhSachQuyen(0);
            }
        }

        protected void OpenForm_Click(object sender, EventArgs e)
        {
            LoadDanhSachQuyen(0);
            wdsQuanLyMenu.ShowOnPageLoad = true;
            txtTenVaiTro.Focus();
            btnLuuLai.Visible = true;
            ResetForm();
            btnUpdate.Visible = false;
            btnLuuLai.Visible = true;
            btnReset.Visible = true;
            grdDanhSachQuyen.Selection.UnselectAll();

        }
       
        protected void LoadDanhSachQuyen(long lngidVaiTro)
        {
            QuyenLogic logic = new QuyenLogic();
            // Get danh sách quyền
            if (donvithaotac() != 0)
            {
                DataTable tblDb = logic.GetListByIDNguoiDung(Utils.GetUserId().ToString(), donvithaotac().ToString());
                if (tblDb.Rows.Count > 0)
                {
                    grdDanhSachQuyen.DataSource = tblDb;
                    grdDanhSachQuyen.DataBind();
                }
            }

            List<v_Quyen_Menu_TN> lstViewQMTN = logic.SelectCheckedQuyen(lngidVaiTro);
            //RowSelectionModel sm = this.grpQuyen.SelectionModel.Primary as RowSelectionModel;
            //foreach (v_Quyen_Menu_TN vw in lstViewQMTN)
            //{
            //    sm.SelectedRows.Add(new SelectedRow(vw.pk_iQuyenID.ToString()));
            //}
            //sm.UpdateSelection();
        }

        protected void LoadGrid()
        {
            VaiTroLogic logic = new VaiTroLogic();
            string strSort = "sTenVaiTro";
            string strDir = "ASC";
            string strFilter = "";
            string NguoiDungID = Utils.GetUserId().ToString();
            var lstMenu = logic.GetListPaging(strSort, strDir, strFilter, NguoiDungID);
            if (lstMenu != null)
            {
                grdDanhSachMenu.DataSource = lstMenu;
                grdDanhSachMenu.DataBind();
                lstMenu = null;
            }
        }
        protected void LoadSelection()
        {
            
        }
        public Dictionary<int, bool> GetCheckedQuyen()
        {
            Dictionary<int, bool> dicRes = null;
            List<object> selectedRowList;
            selectedRowList = (grdDanhSachQuyen.GetSelectedFieldValues(new string[] { "pk_iQuyenID" }));
            if (selectedRowList.Count > 0)
            {
                dicRes = new Dictionary<int, bool>();
                for (int i = 0; i < selectedRowList.Count; i++)
                {
                    dicRes.Add(int.Parse(selectedRowList[i].ToString()), false);
                }
            }
            return dicRes;
        }
        protected void LuuLai_Click(object sender, EventArgs e)
        {
            VaiTroLogic logic = new VaiTroLogic();
            string _phay = "";
            string strMultiIds;
            strMultiIds = string.Empty;
            List<object> selectedRowList;
            tbl_VaiTro objVaiTro = new tbl_VaiTro();
            selectedRowList = (grdDanhSachQuyen.GetSelectedFieldValues(new string[] { "pk_iQuyenID" }));
            if (txtTenVaiTro.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên vai trò không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenVaiTro.Focus();
                return;
            }

            objVaiTro.sTenVaiTro = txtTenVaiTro.Text;
            objVaiTro.sGhiChu = txtsGhiChu.Text;
            objVaiTro.fk_iDonViID = Utils.GetRootDepartmentID(donvithaotac());
            objVaiTro.fk_iNguoiCapNhatID = Utils.GetUserId();
            objVaiTro.bKichHoat = true;
            objVaiTro.fk_iNguoiTaoID = Utils.GetUserId();
            objVaiTro.fk_iNguoiCapNhatID = Utils.GetUserId();
            Dictionary<int, bool> dicQuyen = GetCheckedQuyen();
            if (selectedRowList.Count != 0)
            {
                if (logic.CheckTrungTenVT(objVaiTro.sTenVaiTro, UtilsData.GetUserDepartment()) == false)
                {
                    Tools.Message(this.Page, "Tên vai trò đã tồn tại!");
                    return;
                }
                else if (logic.Insert(objVaiTro, dicQuyen))
                {
                    try
                    {
                        string Paths = logic.GetByID(long.Parse(Session[Constants.session_vaitroquanly_id.ToString()].ToString())).sPath;
                        objVaiTro.sPath = Paths + objVaiTro.pk_iVaiTroID + "/";
                        logic.UpdateVaitrosPath(objVaiTro);
                    }
                    catch (Exception ex)
                    {

                    }

                    Tools.Message(this.Page, "Thêm thành công!");
                    grdDanhSachQuyen.Selection.UnselectAll();
                    wdsQuanLyMenu.ShowOnPageLoad = false;
                    txtTenVaiTro.Focus();
                    LoadGrid();
                    ResetForm();
                    LoadDanhSachQuyen(0);
                }
                else
                {
                    Tools.Message(this.Page, "Thêm mới thất bại!");
                    grdDanhSachQuyen.Selection.UnselectAll();
                    wdsQuanLyMenu.ShowOnPageLoad = false;
                    LoadDanhSachQuyen(0);
                    ResetForm();
                    return;
                }
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Chưa gán quyền cho vai trò!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                return;
            }


        }

        protected void ResetForm()
        {
            txtTenVaiTro.Text = "";
            txtsGhiChu.Text = "";
        }
        public void grdTest_RowCommand(object sender, ASPxGridViewRowCommandEventArgs e)
        {
            VaiTroLogic logic = new VaiTroLogic();
            int id = Convert.ToInt32(e.KeyValue);
            switch (e.CommandArgs.CommandName)
            {
                case "Edit":
                  Session.Add("Id",id);
                    btnUpdate.Visible = true;
                    btnLuuLai.Visible = false;
                    tbl_VaiTro objVaitro = logic.GetByID(id);
                    if (objVaitro.fk_iNguoiTaoID != Utils.GetUserId())
                    {
                        Tools.Message(this.Page,"Bạn không có quyền sửa vai trò này");
                        return;
                    }
                    LoadFromByID(id);
                    LoadQuyenByVaiTroID(id);
                    grdDanhSachMenu.Columns[6].Visible= true;
                    grdDanhSachMenu.Columns[7].Visible = true;
                    grdDanhSachMenu.Columns[8].Visible = true;
                    wdsQuanLyMenu.ShowOnPageLoad = true;
                    idDonViThaoTac = donvithaotac();
                    if (!util.checkQuyenThaoTac(idUser, idDonViThaoTac, idVaiTro, "QuanLyVaiTro", "VAI_TRO", Constants.ACTION_UPDATE))
                    {
                        btnUpdate.Visible = false;
                    }
                    else
                        btnUpdate.Visible = true;
                    
                   
                    break;
                case "Delete":
                    RBACDataContext db = new RBACDataContext(ConfigurationSettings.AppSettings["ConnectString"]);
                  objVaitro = logic.GetByID(id);
                    if (objVaitro.fk_iNguoiTaoID != Utils.GetUserId())
                    {
                        Tools.Message(this.Page,"Bạn không có quyền xóa vai trò này");
                        return;
                    }
                  
                    tbl_VaiTroNguoiDungDonVi objVaiTroNguoiDungDonVi = (from m in db.tbl_VaiTroNguoiDungDonVis
                                                                        where m.fk_iVaiTroID == id
                                                                        && m.bKichHoat == true
                                                                        select m).FirstOrDefault<tbl_VaiTroNguoiDungDonVi>();
                  
                    if (objVaiTroNguoiDungDonVi != null)
                    {
                        Tools.Message(this.Page,"Không thể xóa vì Vai trò được sử dụng trong Phân quyền người dùng!");
                        return;
                    }
                   
                    if (logic.Delete(id))
                    {
                        Tools.Message(this.Page,"Xóa thành công!");
                        LoadGrid();
                    }
                    else
                    {
                        Tools.Message(this.Page,"Xóa thất bại!");
                    }
                    break;
                   
            }
        }
        public long donvithaotac()
        {
            idVaiTro = long.Parse(Utils.GetSession_value(Response, Page, Constants.session_vaitroquanly_id));
            idUser = long.Parse(Utils.GetSession_value(Response, Page, Constants.session_user_id));
            return util.LayDonviThaoTac(idVaiTro, idUser, "VAI_TRO", Constants.ACTION_READ, "QuanLyVaiTro");
        }
        public void LoadFromByID(long _lngVaiTroID)
        {
            VaiTroLogic logic = new VaiTroLogic();
            tbl_VaiTro objVaiTro = logic.GetByID(_lngVaiTroID);
            if (objVaiTro != null && objVaiTro.pk_iVaiTroID > 0)
            {
                txtTenVaiTro.Text = objVaiTro.sTenVaiTro;
                txtsGhiChu.Text = objVaiTro.sGhiChu;
            }
            logic = null;
        }
        public void LoadQuyenByVaiTroID(long _lngVaiTroID)
        {
            QuyenLogic logic = new QuyenLogic();
            grdDanhSachQuyen.Selection.UnselectAll();
            // Get danh sách quyền
            if (donvithaotac() != 0)
            {
                DataTable tblDb = logic.GetListByIDNguoiDung(Utils.GetUserId().ToString(), donvithaotac().ToString());
                if (tblDb.Rows.Count > 0)
                {
                    grdDanhSachQuyen.DataSource = tblDb;
                    grdDanhSachQuyen.DataBind();
                    
                     
                }
            }
            List<v_Quyen_Menu_TN> lstViewQMTN = logic.SelectCheckedQuyen(_lngVaiTroID);
            List<object> selectedRowList;
            tbl_VaiTro objVaiTro = new tbl_VaiTro();
            selectedRowList = (grdDanhSachQuyen.GetSelectedFieldValues(new string[] { "pk_iQuyenID" }));
            foreach (v_Quyen_Menu_TN vw in lstViewQMTN)
            {
                
                grdDanhSachQuyen.Selection.SelectRowByKey(vw.pk_iQuyenID);
            }
           
            //List<tbl_QuyenVaiTro> listQuyenvaitro = (from m in db.tbl_QuyenVaiTros
            //                                         where m.fk_iVaiTroID == _lngVaiTroID
            //                                         select m).ToList<tbl_QuyenVaiTro>();
            //if (listQuyenvaitro.Count > 0)
            //{
            //    foreach (var tblQuyenVaiTro in listQuyenvaitro)
            //    {
            //        long lngIdQuyen = tblQuyenVaiTro.fk_iQuyenID;
            //        List<v_Quyen_Menu_TN> listDb1 = (from m in db.v_Quyen_Menu_TNs
            //                                   where m.pk_iQuyenID == lngIdQuyen
            //                                   select m).ToList<v_Quyen_Menu_TN>();
            //        RowSelectionModel sm = this.grpQuyen.SelectionModel.Primary as RowSelectionModel;
            //        foreach (v_Quyen_Menu_TN item in listDb1)
            //        {
            //            sm.SelectedRows.Add(new SelectedRow(item.pk_iQuyenID.ToString()));
            //        }
            //        sm.UpdateSelection();
            //    }
            //}

        //    List<v_Quyen_Menu_TN> lstViewQMTN = logic.SelectCheckedQuyen(_lngVaiTroID);
          //  RowSelectionModel sm = this.grpQuyen.SelectionModel.Primary as RowSelectionModel;
           // foreach (v_Quyen_Menu_TN vw in lstViewQMTN)
           // {
               // sm.SelectedRows.Add(new SelectedRow(vw.pk_iQuyenID.ToString()));
         //   }
           /// sm.UpdateSelection();

        }
        //protected void DeleteMenu(long id)
        //{
        //    VaiTroLogic logic = new VaiTroLogic();
        //    db = new RBACDataContext(_conn);
        //    hdIdVaiTro.Text = id + "";
        //    tbl_VaiTro objVaitro = logic.GetByID(id);

        //    objVaitro = logic.GetByID(long.Parse(hdIdVaiTro.Text));
        //    if (objVaitro.fk_iNguoiTaoID != Utils.GetUserId())
        //    {
        //        Tools.Message(this.Page, "Bạn không có quyền xóa vai trò này");
        //        return;
        //    }
        //    tbl_VaiTroNguoiDungDonVi iVaiTro = (from m in db.tbl_VaiTroNguoiDungDonVis
        //                                        where m.fk_iVaiTroID == id
        //                                              && m.bKichHoat == true
        //                                        select m).FirstOrDefault();
        //    if (iVaiTro != null)
        //    {
        //        Tools.Message(this.Page, "Không thể xóa vì Vai trò được sử dụng trong Phân quyền người dùng!");

        //    }
        //    else
        //    {
        //        if (logic.Delete(id))
        //        {
        //            Tools.Message(this.Page, "Xóa thành công!");
        //            LoadGrid();
        //        }
        //        else
        //        {
        //            Tools.Message(this.Page, "Xóa thất bại!");
        //        }
        //    }
            
        //}

      

        protected void Reset_Click(object sender, EventArgs e)
        {
            ResetForm();
            txtTenVaiTro.Focus();
            grdDanhSachQuyen.Selection.UnselectAll();
        }
         public tbl_VaiTro GetObjectFromForm()
        {
            tbl_VaiTro objRes = new tbl_VaiTro();
            objRes.sTenVaiTro = Tools.ChuanHoaXau(txtTenVaiTro.Text);
            objRes.sGhiChu = Tools.ChuanHoaXau(txtsGhiChu.Text);
            //objRes.fk_iDonViID = long.Parse("0" + cboDonViForm.Text);
            objRes.fk_iDonViID = Utils.GetRootDepartmentID(donvithaotac()); //Mặc định vai trò cho đơn vị gốc
            objRes.fk_iNguoiCapNhatID = Utils.GetUserId();
            //objRes.bDungChung = Convert.ToBoolean(TypeHelper.ToInt32(cboKieuVaiTro.Text));
            return objRes;
        }
         public string sGetCheckQUyen()
         {
           
             string sRes = "";
             List<object> selectedRowList;

             selectedRowList = (grdDanhSachQuyen.GetSelectedFieldValues(new string[] { "pk_iQuyenID" }));
             foreach (var item in selectedRowList)
             {
                 sRes += item.ToString() + ",";
             }
             if (sRes != "")
             {
                 return sRes.Substring(0, sRes.Length - 1);
             }
             else
                 return sRes;
         }
        protected void Update_Click(object sender, EventArgs e)
        {
             VaiTroLogic logic = new VaiTroLogic();
            tbl_VaiTro objVaiTro = GetObjectFromForm();
            objVaiTro.bKichHoat = true;
            objVaiTro.fk_iNguoiTaoID = Utils.GetUserId();
            objVaiTro.pk_iVaiTroID = Convert.ToInt32(Session["Id"]);
            List<object> selectedRowList;
          
            selectedRowList = (grdDanhSachQuyen.GetSelectedFieldValues(new string[] { "pk_iQuyenID" }));
            objVaiTro.dNgayCapNhat = DateTime.Now;
            Dictionary<int, bool> dicQuyen = GetCheckedQuyen();
            string sListQuyen = sGetCheckQUyen();
            if (selectedRowList.Count>0)
            {
                try
                {
                    if (logic.UpdateVaiTro(objVaiTro, sListQuyen))
                    {
                        Tools.Message(this.Page,"Cập nhật thành công!");
                        LoadGrid();
                    }
                    else
                    {
                        Tools.Message(this.Page,"Cập nhật thất bại!");
                    }
                }
                catch (Exception ex)
                {
                    Tools.Message(this.Page,"Cập nhật thất bại!");
                }

                wdsQuanLyMenu.ShowOnPageLoad = false;
            }
            else
            {
                Tools.Message(this.Page,"Chưa gán quyền cho vai trò!");
                return;
            }

            logic = null;
        }
        }
        
    }

